#include"TableModel.h"




TableModel::TableModel(QObject*  parent )
	:QAbstractTableModel(parent)
{
}

TableModel::TableModel(QList<Contact> contacts , QObject* parent  )
	:QAbstractTableModel(parent),
	contacts_(contacts)
{
}


int TableModel::rowCount( const QModelIndex& parent) const
{
	Q_UNUSED(parent);
	return contacts_.size();
}

int TableModel::columnCount( const QModelIndex& parent) const
{
	Q_UNUSED(parent);
	return 2;// only have name and address this two;
}

QVariant TableModel::data(const QModelIndex& index , int role) const
{
	if(!index.isValid())
	{
		return QVariant();
	}

	if(index.row() >= contacts_.size() || index.row() < 0)
	{
		return QVariant();
	}

	if(role == Qt::DisplayRole)
	{
		const auto& contact = contacts_.at(index.row());
		
		if(index.column() == 0)
		{
			return contact.name_;
		}else if(index.column() == 1)
		{
			return contact.address_;
		}else{
		}
	}
	return QVariant();
}

QVariant TableModel::headerData(int section , Qt::Orientation orientation , int role) const
{
	if(role != Qt::DisplayRole)
	{
		return QVariant();
	}

	if( orientation == Qt::Horizontal)
	{
		switch(section)
		{
			case 0:
				return tr("Name");
			case 1:
				return tr("Address");
			default:
				return QVariant();
		}
	}
	return QVariant();
}

Qt::ItemFlags TableModel::flags( const QModelIndex& index) const
{
	if(!index.isValid())
		return Qt::ItemIsEnabled;

	return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}

bool TableModel::setdata(const QModelIndex& index , const QVariant& value , int role)
{
	if(index.isValid()  && role == Qt::EditRole)
	{
		int row = index.row();
		auto contact = contacts_.value(row);

		if(index.column() == 0)
			contact.name_ =  value.toString();
		else if(index.column() == 1)
			contact.address_ = value.toString();
		else
			return false;

		contacts_.replace(row , contact);
		emit(dataChanged(index , index));
		
		return true;
	}
	return false;
}

bool TableModel::insertRows(int position , int rows , const QModelIndex& index)
{
	Q_UNUSED(index);
	beginInsertRows(QModelIndex() , position , position + rows - 1);

	for( int row = 0; row <rows; ++row)
	{
		contacts_.insert(position , {QString() , QString()});
	}

	endInsertRows();
}

bool TableModel::removeRows(int position , int rows , const QModelIndex& index)
{
	Q_UNUSED(index);
	beginRemoveRows(QModelIndex()  , position , position + rows - 1);

	for(int row =0; row <rows; ++row)
	{
		contacts_.removeAt(position);
	}

	endRemoveRows();
	return true;
}

QList<Contact> TableModel::getContacts() const
{
}


QList<Contact> TableModel::getcontacts() const
{
	return contacts_;
}
